/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mvc.dao;

import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.util.LinkedList;
import mvc.dao.AspiranteDAO;
import mvc.modelos.Aspirante;
import mvc.modelos.Cuenta;
import mvc.modelos.DirectorDeGrupo;
import mvc.modelos.JefeDeCultura;
import mvc.modelos.Persona;
import mvc.modelos.Rol;
import mvc.modelos.Secretaria;

/**
 *
 * @author pezcado
 */
public class PersonaDAO implements IDAO<Persona> {
    
    private PreparedStatement consultar;
    private PreparedStatement insertar;
    private PreparedStatement modificar; // no necesitas tantos objetos de prepareStatement, con uno solo te basta
    private PreparedStatement eliminar;
    private PreparedStatement listar;
    private Model model;

    public Persona consultar(int identificacion) throws SQLException {
        model= Model.getInstance();
        String sql="select identificacion, tipoId, nombre, apellido, telefono, correo, direccion, "
                + "tipoPersona, id, estado, descripcion from Persona where identificacion="+identificacion;
        consultar=model.getCon().prepareStatement(sql);
        ResultSet resultSet= consultar.executeQuery();
        Persona persona= new Persona();
        
        try{
            resultSet.next();
            
            persona.setIdentificacion(resultSet.getInt("identificacion"));
            persona.setTipoId(resultSet.getString("tipoId"));
            persona.setNombre(resultSet.getString("nombre"));
            persona.setApellido(resultSet.getString("apellido"));
            persona.setTelefono(resultSet.getString("telefono"));
            persona.setCorreo(resultSet.getString("correo"));
            persona.setDireccion(resultSet.getString("direccion"));
            persona.setTipoDePersona(resultSet.getString("tipoPersona"));
            persona.setId(resultSet.getInt("id"));
            persona.setEstado(resultSet.getString("estado"));
            persona.setDescripcion(resultSet.getString("descripcion"));
            
            //return persona;
        }catch(Exception e){
            
        }
            
        return persona;
    }
        
    // consultar por nombre la tabla Persona
    public Persona consultar(String nombre) throws SQLException {
        model= Model.getInstance();
        consultar = model.getCon().prepareStatement("select * from Persona where lower(nombre) like ?;");      // defines la consulta
        consultar.setString(1, "%"+nombre+"%");  // seteas el valor cambiante en la consulta
        ResultSet resultSet= consultar.executeQuery(); // ejecutas y obtienes los registros, pero en un objeto que no sabes maneajar
        Persona persona= new Persona(); // creas una nueva persona para saber o mas bien para convertir ese registro que desconoces
        
        try{
            resultSet.next();
            
            persona.setIdentificacion(resultSet.getInt("identificacion")); // empiezas a setiar segun las columas los atributos de la persons
            persona.setTipoId(resultSet.getString("tipoId"));
            persona.setNombre(resultSet.getString("nombre"));
            persona.setApellido(resultSet.getString("apellido"));
            persona.setTelefono(resultSet.getString("telefono"));
            persona.setCorreo(resultSet.getString("correo"));
            persona.setDireccion(resultSet.getString("direccion"));
            persona.setTipoDePersona(resultSet.getString("tipoPersona"));
            persona.setId(resultSet.getInt("id"));
            persona.setEstado(resultSet.getString("estado"));
            persona.setDescripcion(resultSet.getString("descripcion"));
            
            
        }catch(Exception e){
            
        }
            
        return persona; // si todo salio bien retornas a la persona tal y como la setiastes entoncs mira,
    }
    
    public void insertar(Persona t)throws SQLException{
        
    }

    public void insertar(Persona IDAO, String nombreUsuario) throws SQLException {
        model= Model.getInstance();
        Rol rol=new Rol();
        RolDAO rolDAO= new RolDAO();
        Cuenta cuenta= new Cuenta();
        CuentaDAO cuentaDAO= new CuentaDAO();
        Aspirante aspirante= new Aspirante();
        AspiranteDAO aspiranteDAO= new AspiranteDAO();
        DirectorDeGrupo directorDeGrupo= new DirectorDeGrupo();
        DirectorDeGrupoDAO directorDeGrupoDAO= new DirectorDeGrupoDAO();
        JefeDeCultura jefeDeCultura= new JefeDeCultura();
        JefeDeCulturaDAO jefeDeCulturaDAO= new JefeDeCulturaDAO();
        Secretaria secretaria= new Secretaria();
        SecretariaDAO secretariaDAO= new SecretariaDAO();
        try{
            if(insertar==null){
                String sql="insert into Persona values(?,?,?,?,?,?,?,?,?,?,?)";
                insertar= model.getCon().prepareStatement(sql);
            }
            
            insertar.setInt(1, IDAO.getIdentificacion());
            insertar.setString(2, IDAO.getTipoId());
            insertar.setString(3, IDAO.getNombre());
            insertar.setString(4, IDAO.getApellido());
            insertar.setString(5, IDAO.getTelefono());
            insertar.setString(6, IDAO.getCorreo());
            insertar.setString(7, IDAO.getDireccion());
            insertar.setString(8, IDAO.getTipoDePersona());
            insertar.setInt(9, IDAO.getId());
            insertar.setString(10, IDAO.getEstado());
            insertar.setString(11, IDAO.getDescripcion());
            
            insertar.executeUpdate();
            
            // creamos el rol de las personas...
            rol.setPersonaIdentificacion(IDAO.getIdentificacion());
            rol.setContrasena(IDAO.getIdentificacion());
            rol.setTipoRol(IDAO.getTipoDePersona());
            rol.setEstado(IDAO.getEstado());
            rol.setDescripcion(IDAO.getDescripcion());
            rolDAO.insertar(rol);
           
            //creamos la cuenta de las personas...
            java.util.Date d=new java.util.Date();
            cuenta.setFechaCreacion(new Date(d.getYear(), d.getMonth(), d.getDay()));
            cuenta.setUltimoAcceso(new Date(d.getYear(), d.getMonth(), d.getDay()));
            cuenta.setNombreUsuario(nombreUsuario);
            cuenta.setContrasena(IDAO.getIdentificacion());
            cuenta.setPersonaIdentificacion(IDAO.getIdentificacion());
            cuenta.setId(cuenta.getCodigo());
            cuenta.setEstado(IDAO.getEstado());
            cuenta.setDescripcion(IDAO.getDescripcion());
            cuentaDAO.insertar(cuenta);
            
            //creamos el actor correspondiente al tipoDePersona y al tipoDeRol
            if(IDAO.getTipoDePersona().equals("Aspirante")){
                //aspirante.setIdentificacion(IDAO.getIdentificacion());
                //aspirante.setCodigo();
                //aspirante.setTipoAspirante();
                aspiranteDAO.insertar(aspirante);
            }else if(IDAO.getTipoDePersona().equals("Director De Grupo")){
                directorDeGrupo.setIdentificacion(IDAO.getIdentificacion());
                directorDeGrupoDAO.insertar(directorDeGrupo);
            }else if(IDAO.getTipoDePersona().equals("Jefe De Cultura")){
                jefeDeCultura.setIdentificacion(IDAO.getIdentificacion());
                jefeDeCulturaDAO.insertar(jefeDeCultura);
            }else if(IDAO.getTipoDePersona().equals("Secretaria")){
                secretaria.setIdentificacion(IDAO.getIdentificacion());
                secretariaDAO.insertar(secretaria);
            }            
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public void modificar(Persona IDAO) throws SQLException {
        model=Model.getInstance();
        String sql="UPDATE Persona SET"
                + " nombre = '"+IDAO.getNombre()+"', "
                + "apellido='"+IDAO.getApellido()+"', "
                + "telefono='"+IDAO.getTelefono()+"', "
                + "correo='"+IDAO.getCorreo()+"', "
                + "direccion='"+IDAO.getDireccion()+"', "
                + "descripcion='"+IDAO.getDescripcion()+"' "
                + "WHERE identificacion="+IDAO.getIdentificacion();
        
        modificar=model.getCon().prepareStatement(sql);
        modificar.executeUpdate();
        
    }

    public void eliminar(Persona IDAO) throws SQLException {
        model=Model.getInstance();
        RolDAO rdao= new RolDAO();
        Rol rol= new Rol();
        CuentaDAO cdao= new CuentaDAO();
        Cuenta c= new Cuenta();
        
        String sql="delete from Persona where identificacion="+IDAO.getIdentificacion();
        eliminar=model.getCon().prepareStatement(sql);
        //eliminamos el rol
        rol= rdao.consultar(IDAO.getIdentificacion());
        rdao.eliminar(rol);
        //eliminamos la cuenta
        c= cdao.consultar(IDAO.getIdentificacion());
        cdao.eliminar(c);
        
        eliminar.executeUpdate();
        
    }

    public LinkedList<Persona> listar() throws SQLException {
        model=Model.getInstance();
        LinkedList<Persona> listaPersonas= new LinkedList<Persona>();
        
        String sql="select identificacion, tipoId, nombre, apellido, telefono, correo, direccion, "
            + "tipoPersona, id, estado, descripcion from Persona";
        listar=model.getCon().prepareStatement(sql); 
        ResultSet resultSet=listar.executeQuery();

        while(resultSet.next()){
            Persona persona= new Persona();
            persona.setIdentificacion(resultSet.getInt("identificacion"));
            persona.setTipoId(resultSet.getString("tipoId"));
            persona.setNombre(resultSet.getString("nombre"));
            persona.setApellido(resultSet.getString("apellido"));
            persona.setTelefono(resultSet.getString("telefono"));
            persona.setCorreo(resultSet.getString("correo"));
            persona.setDireccion(resultSet.getString("direccion"));
            persona.setTipoDePersona(resultSet.getString("tipoPersona"));
            persona.setId(resultSet.getInt("id"));
            persona.setEstado(resultSet.getString("estado"));
            persona.setDescripcion(resultSet.getString("descripcion"));
            listaPersonas.add(persona);
            
       }
            
        //System.out.println("Lista dao=="+listaPersonas.size() );
        return listaPersonas;
        
    }
    
}
